package com.servlet.model.database;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import com.servlet.model.base.*;

/**
 * Interface de la base de données
 * @author Jing Jing
 */
public interface BaseAcces {

	/**
	 * 
	 * @return vrai réussi à connecter faux défaillance
	 */
	public boolean connect();

	/**
	 * 
	 * @return vrai réussi à connecter faux défaillance
	 */
	public boolean deconnect();

	/**
	 * Verifie si le password correspond au email
	 * 
	 * @param email
	 * @param passwd
	 * @return vrai il existe un compte, faux sinon
	 */
	public boolean verifyAccount(String email, String passwd);
	
	/**
	 * Verifie si le password est correct
	 * 
	 * @param passwd
	 * @return vrai si le mot de passe est dans la base, faux sinon
	 */
	public boolean verifyAdmin(String passwd);

	/**
	 * Obtenir le mot de passe
	 * 
	 * @param email
	 * @return le mot de passe si le compte existe. Sinon, null ou ""
	 */
	public String getPasswd(String email);

	/**
	 * Modifie le mot de passe
	 * 
	 * @param email
	 * @param oldPasswd
	 * @param newPasswd
	 * @return vrai réussi à modifier le mot de passe, faux sinon
	 */
	public boolean modifyPasswd(String email, String oldPasswd, String newPasswd);

	/**
	 * Enregistre un compte
	 * 
	 * @param email
	 * @param passwd
	 * @param first_name
	 * @param last_name
	 * @param birth_day
	 * @return vrai réussi à créer un compte, faux sinon
	 */
	public boolean addCompte(String email, String passwd, String first_name,
			String last_name, Date birth_day);

	/**
	 * Enregistre une news
	 * 
	 * @param email_user1
	 * @param email_user2
	 * @param date_publish
	 * @param genre
	 * @return vrai réussi à créer un news, faux sinon
	 */
	public boolean addNews(String email_user1, String email_user2,
			Date date_publish, int genre);

	/**
	 * Enregistre une news
	 * 
	 * @param email_user1
	 * @param email_user2
	 * @param date_publish
	 * @param genre
	 * @param info_sup
	 * @return vrai réussi à créer un news, faux sinon
	 */
	public boolean addNews(String email_user1, String email_user2,
			Date date_publish, int genre, String info_sup);
	
	/**
	 * Enregistre une étude
	 * 
	 * @param email
	 * @param school
	 * @param date_begin
	 * @param date_end
	 * @param major
	 * @param city_code
	 * @param country
	 * @param city
	 * @return vrai réussi à créer une étude, faux sinon
	 */
	public boolean addStudy(String email, String school, Date date_begin,
			Date date_end, String major, int city_code, String country,
			String city);

	/**
	 * Enregistre une expérience professionnel
	 * 
	 * @param email
	 * @param enterprise
	 * @param date_begin
	 * @param date_end
	 * @param post
	 * @param activity_domain
	 * @param description
	 * @param city_code
	 * @param country
	 * @param city
	 * @return vrai réussi à créer une expérience professionnel , faux sinon
	 */
	public boolean addExperience(String email, String enterprise,
			Date date_begin, Date date_end, String post,
			Sector activity_domain, String description, int city_code,
			String country, String city);

	/**
	 * Enregistre un contact
	 * 
	 * @param email_user1
	 * @param email_user2
	 * @param date_invitation
	 * @return vrai réussi à créer un contact, faux sinon
	 */
	public boolean addContact(String email_user1, String email_user2,
			Date date_invitation);

	/**
	 * Supprimer un news
	 * 
	 * @param news
	 * @return vrai réussi à supprimer un news, faux sinon
	 */
	public boolean removeNews(News news);

	/**
	 * Supprimer un contact
	 * 
	 * @param contact
	 * @return vrai réussi à supprimer un contact, faux sinon
	 */
	public boolean removeContact(Contact contact);

	/**
	 * Supprimer une étude
	 * 
	 * @param study
	 * @return vrai réussi à supprimer une étude, faux sinon
	 */
	public boolean removeStudy(Study study);

	/**
	 * Supprimer une expérience professionnel
	 * 
	 * @param experience
	 * @return vrai réussi à supprimer une expérience professionnele, faux sinon
	 */
	public boolean removeExperience(Experience experience);

	/**
	 * Renouveller un profil
	 * 
	 * @param profil
	 * @return vrai réussi à renouveller un profil, faux sinon
	 */
	public boolean updateProfil(Profile profile);

	/**
	 * Renouveller une étude
	 * 
	 * @param study
	 * @return vrai réussi à renouveller une étude, faux sinon
	 */
	public boolean updateStudy(Study study);

	/**
	 * Renouveller une expérience professionnel
	 * 
	 * @param experience
	 * @return vrai réussi à renouveller une expérience professionnele, faux
	 *         sinon
	 */
	public boolean updateExperience(Experience experience);

	/**
	 * Renouveller un contact
	 * 
	 * @param contact
	 * @return vrai réussi à renouveller un contact, faux sinon
	 */
	public boolean updateContact(Contact contact);
	
	/**
	 * Chercher un lieu
	 * @param city_code
	 * @return area
	 */
	public Area findArea(int city_code);
	
	/**
	 * Chercher un profil
	 * @param email
	 * @return profile
	 */
	public Profile findProfile(String email);
	
	/**
	 * Chercher les emails manuelle par nom/prenom
	 * @param first_name
	 * @param last_name
	 * @return les emails
	 */
	public ArrayList<String> findEmailByName(String name);
	
	/**
	 * Chercher les emails manuelle par l'entreprise
	 * @param enterprise
	 * @return les emails
	 */
	public ArrayList<String> findEmailByEnterprise(String enterprise);
	
	/**
	 * Chercher les emails manuelle par l'etude
	 * @param school
	 * @return les emails
	 */
	public ArrayList<String> findEmailBySchool(String school);
	
	/**
	 * Chercher les emails par outil
	 * @param account
	 * @return les emails
	 */
	public ArrayList<String> findEmailBySchoolTool(String email);
	
	/**
	 * Chercher les emails par outil
	 * @param account
	 * @return les emails
	 */
	public ArrayList<String> findEmailByEntrepriseTool(String email);
	
	/**
	 * Chercher les études
	 * @param email
	 * @return les études
	 */
	public ArrayList<Study> findStudies(String email);
	
	/**
	 * Chercher les expériences professionnels
	 * @param email
	 * @return les expériences professionnels
	 */
	public ArrayList<Experience> findExperiences(String email);
	
	/**
	 * Chercher les contacts
	 * @param email
	 * @return les contacts
	 */
	public ArrayList<Contact> findContacts(String email);
	
	/**
	 * Chercher les news
	 * @param email
	 * @return les news
	 */
	public ArrayList<News> findNews(String email);
	
	/**
	 * Chercher les études par sepécialité
	 * @param major
	 * @return les études
	 */
	public ArrayList<Study> findStudiesByMajor(String major);
	
	/**
	 * Verifier s'il existe l'email
	 * @param email
	 * @return
	 */
	public boolean existEmail( String email );

	public Collection<String> findEveryEmail();
	
	/**
	 * Ajouter l'administrator
	 * @param passwd
	 * @param coefPro
	 * @param coefProfile
	 * @param coefStudy
	 * @return
	 */
	public boolean addAdministrator(String passwd,  double coefPro, double coefProfile, double coefStudy);

	/**
	 * Verifier s'il existe le mot de passe de l'administrator
	 * @param passwd
	 * @return
	 */
	public boolean existPasswd(String passwd);
	
	/**
	 * Supprimer le compte de l'administrator
	 * @param admin
	 * @return
	 */
	public boolean removeAdmin(Administrator admin);
	
	/**
	 * Rechercher le compte de l'administrator
	 * @param passwd
	 * @return
	 */
	public Administrator findAdmin(String passwd);
	
	/**
	 * Modifier le mot de passe
	 * @param oldPasswd
	 * @param newPasswd
	 * @return
	 */
	
	public Administrator findAdmin();
	
	/**
	 * Modifier le mot de passe
	 * @param oldPasswd
	 * @param newPasswd
	 * @return
	 */
	
	public boolean modifyPasswdAdmin(String oldPasswd, String newPasswd);
	
	/**
	 * Renouveler le compte de l'administrator
	 * @param admin
	 * @return
	 */
	public boolean updateAdministrator(Administrator admin);

	public ArrayList<String> findEmailBySpecialite(String specialite);
	
	/**
	 * Obtenir le mot de passe, le nom et le prenom
	 * @param email
	 * @return
	 */
	public HashMap<String,String> getPasswdName(String email);
	
	public ArrayList<String> getFieldOfTable( String table , String field , String word );
}
